package fmppc.manager;

import com.baomidou.mybatisplus.core.conditions.Wrapper;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.springframework.transaction.annotation.Transactional;

import java.io.Serializable;
import java.util.Arrays;
import java.util.Collection;
import java.util.stream.Collectors;

/**
 * 类描述:  基础MyBatis通用业务处理对象简单
 *
 * @author 王雷
 * @version 1.0.0
 * @date 2022/5/31 0031 下午 2:35
 */
public class PlusCommonManagerService<M extends BaseMapper<T>, T> extends ServiceImpl<M, T> implements ICommonManagerService {

    /**
     * 功能描述：批量保存
     *
     * @param entityList 需要修改的数据
     * @param batchSize  更新长度
     * @return 处理结果
     * @date : 2022/11/10 0010 上午 11:32
     */
    @Override
    @Transactional(rollbackFor = Exception.class)
    public boolean saveBatch(Collection<T> entityList, int batchSize) {
        return super.saveBatch(entityList, batchSize);
    }

    /**
     * 功能描述：批量保存数据
     *
     * @param entityList 需要修改的数据
     * @return 处理结果
     * @date : 2022/11/10 0010 上午 11:32
     */
    @Override
    @Transactional(rollbackFor = Exception.class)
    public boolean saveBatch(Collection<T> entityList) {
        return super.saveBatch(entityList);
    }

    /**
     * 功能描述：保存数据
     *
     * @param entity 需要保存的数据
     * @return 处理结果
     * @date : 2022/11/10 0010 上午 11:33
     */
    @Override
    @Transactional(rollbackFor = Exception.class)
    public boolean save(T entity) {
        return super.save(entity);
    }

    /**
     * 功能描述：更新数据数据
     *
     * @param updateWrapper 更新条件
     * @return 处理结果
     * @date : 2022/11/10 0010 上午 11:33
     */
    @Override
    @Transactional(rollbackFor = Exception.class)
    public boolean update(Wrapper<T> updateWrapper) {
        return super.update(updateWrapper);
    }

    /**
     * 功能描述：根据主键批量更新数据
     *
     * @param entityList 需要修改的数据
     * @param batchSize  更新长度
     * @return 处理结果
     * @date : 2022/11/10 0010 上午 11:29
     */
    @Override
    @Transactional(rollbackFor = Exception.class)
    public boolean updateBatchById(Collection<T> entityList, int batchSize) {
        return super.updateBatchById(entityList, batchSize);
    }

    /**
     * 功能描述：根据主键更新数据
     *
     * @param entity 需要修改的数据；必须包含主键信息
     * @return 处理结果
     * @date : 2022/11/10 0010 上午 11:29
     */
    @Override
    @Transactional(rollbackFor = Exception.class)
    public boolean updateById(T entity) {
        return super.updateById(entity);
    }

    /**
     * 功能描述：添加或保存数据
     *
     * @param entity 需要新增或修改的数据；修改数据：主键必须存在；新增数据主键必须为空
     * @return 处理结果
     * @date : 2022/11/10 0010 上午 11:29
     */
    @Override
    @Transactional(rollbackFor = Exception.class)
    public boolean saveOrUpdate(T entity) {
        return super.saveOrUpdate(entity);
    }

    /**
     * 功能描述：批量更新或修改
     *
     * @param entityList 需要新增或修改的数据；修改数据：主键必须存在；新增数据主键必须为空
     * @return 处理结果
     * @date : 2022/11/10 0010 上午 11:31
     */
    @Override
    @Transactional(rollbackFor = Exception.class)
    public boolean saveOrUpdateBatch(Collection<T> entityList) {
        return super.saveOrUpdateBatch(entityList);
    }

    /**
     * 功能描述：根据主键删除数据
     *
     * @param id 主键值
     * @return 处理结果
     * @date : 2022/11/10 0010 上午 11:31
     */
    @Override
    @Transactional(rollbackFor = Exception.class)
    public boolean removeById(Serializable id) {
        return super.removeById(id);
    }

    /**
     * 功能描述：获取指定查询字段的QueryWrapper对象
     *
     * @param selectValue 自定义的SELECT值
     * @return 函数查询对象
     * @date : 2022/12/9 0009 上午 9:53
     */
    protected LambdaQueryWrapper<T> giveLqwAssignSelect(String selectValue) {
        return new QueryWrapper<T>().select(selectValue).lambda();
    }

    /**
     * 功能描述：获取指定查询字段的QueryWrapper对象
     *
     * @param selectValues 自定义的SELECT值
     * @return 函数查询对象
     * @date : 2022/12/9 0009 上午 9:53
     */
    protected LambdaQueryWrapper<T> giveLqwAssignSelect(String... selectValues) {
        return new QueryWrapper<T>().select(Arrays.stream(selectValues).map(Object::toString)
                .collect(Collectors.joining(","))).lambda();
    }

    /**
     * 功能描述：获取指定查询字段的QueryWrapper对象
     *
     * @param attributeFunction 自定义的SELECT字段函数
     * @return 函数查询对象
     * @date : 2022/12/9 0009 上午 9:53
     */
    protected LambdaQueryWrapper<T> giveLqwAssignSelect(AttributeFunction<T>... attributeFunction) {
        return new QueryWrapper<T>().select(Arrays.stream(attributeFunction).map(DataAttributeLambdaUtils::giveAttributeFields)
                .collect(Collectors.joining(","))).lambda();
    }
}
